Retrieving
Compact Disc Track-Specific Information
For CD audio
devices, you can get the starting location and length of a track by specifying
the MCI_TRACK flag and setting the dwTrack member of MCI_STATUS_PARMS
// Uses the MCI_STATUS command to get and display
the
// starting times for the tracks on a compact disc.
// Returns 0L if successful; otherwise, it returns
an
// MCI error code.
DWORD getCDTrackStartTimes(VOID)
{
UINT
wDeviceID;
int i,
iNumTracks;
DWORD
dwReturn;
DWORD
dwPosition;
DWORD
*pMem;
char
szTempString[64];
char
szTimeString[512] = "\0"; //
room for 20 tracks
MCI_OPEN_PARMS mciOpenParms;
MCI_SET_PARMS mciSetParms;
MCI_STATUS_PARMS mciStatusParms;
// Open
the device by specifying the device name.
mciOpenParms.lpstrDeviceType = "cdaudio";
if (dwReturn
= mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE, (DWORD)(LPVOID) &mciOpenParms))
{
//
Failed to open device.
//
Don't close device; just return error.
return
(dwReturn);
}
// The
device opened successfully; get the device ID.
wDeviceID
= mciOpenParms.wDeviceID;
// Set the time format to minute/second/frame (MSF)
format.
mciSetParms.dwTimeFormat = MCI_FORMAT_MSF;
if
(dwReturn = mciSendCommand(wDeviceID, MCI_SET,
MCI_SET_TIME_FORMAT,
(DWORD)(LPVOID) &mciSetParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return
(dwReturn);
}
// Get the
number of tracks;
// limit
to number that can be displayed (20).
mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
if
(dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return
(dwReturn);
}
iNumTracks
= mciStatusParms.dwReturn;
iNumTracks
= min(iNumTracks, 20);
//
Allocate memory to hold starting positions.
pMem =
(DWORD *)LocalAlloc(LPTR,
iNumTracks * sizeof(DWORD));
if (pMem
== NULL)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (-1);
}
// For each track, get and save the starting
location and
// build a string containing starting locations.
for(i=1;
i<=iNumTracks; i++)
{
mciStatusParms.dwItem = MCI_STATUS_POSITION;
mciStatusParms.dwTrack = i;
if
(dwReturn = mciSendCommand(wDeviceID,
MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK,
(DWORD)(LPVOID) &mciStatusParms)) {
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
pMem[i-1] = mciStatusParms.dwReturn;
wsprintf(szTempString,
"Track %2d - %02d:%02d:%02d\n", i,
MCI_MSF_MINUTE(pMem[i-1]),
MCI_MSF_SECOND(pMem[i-1]),
MCI_MSF_FRAME(pMem[i-1]));
lstrcat(szTimeString, szTempString);
}
// Use
MessageBox to display starting times.
MessageBox(hMainWnd, szTimeString,
"Track Starting Position", MB_ICONINFORMATION);
// Free
memory and close the device.
LocalFree((HANDLE) pMem);
if
(dwReturn = mciSendCommand(wDeviceID,
MCI_CLOSE, 0, NULL)) {
return
(dwReturn);
}
return
(0L);
}